package com.lesson12.dynamic;

import java.lang.reflect.Proxy;

/**
 * @author 朝花不迟暮
 * @version 1.0
 * @date 2020/9/3 9:52
 */
public class ProxyFactory
{
    private Object obj;

    public ProxyFactory(Object obj)
    {
        this.obj = obj;
    }

    //目标对象生成代理对象
    public Object getInstance()
    {
        //1. ClassLoader loader :指定当前目标对象使用的类加载器，获取加载器的方法固定
        //2. Class<?>[ ] interfaces: 目标对象实现的接口类型， 使用泛型方法确认类型
        //3. InvocationHandler h :事情处理，执行目标对象的方法时，会触发事情处理器方法，
        // 会把当前执行的目标对象方法作为参数传入
        ClassLoader loader = obj.getClass().getClassLoader();
        Class<?>[] classes = obj.getClass().getInterfaces();
        Object proxyInstance = Proxy.newProxyInstance(loader, classes, (proxy, method, args) -> {
            System.out.println("jdk代理开始");
            Object invoke = null;
            if (method.getName().equals("say"))
            {
                //反射机制调用目标对象方法
                invoke = method.invoke(obj, args);
            }

            return invoke;
        });
        return proxyInstance;
    }
}
